package org.example.myleet.p393;

public class Solution {

    public boolean validUtf8(int[] data) {
        int i = 0;
        while (i < data.length) {
            int bytes;
            if (data[i] < 0b10000000) {
                //属于小字节，跳过这个字节
                ++i;
                continue;
            }
            if (data[i] < 0b11000000) {
                //不能存在0b10XXXXXX这种
                return false;
            }
            if (data[i] < 0b11100000) {
                //后面应该跟1个字节
                bytes = 1;
            } else if (data[i] < 0b11110000) {
                bytes = 2;
            } else if (data[i] < 0b11111000) {
                bytes = 3;
            } else {
                //UTF-8最多连续4个字节，因此长度标志字节后面超过3个字节的标记是不合法的
                return false;
            }
            ++i;
            for (int j = 0; j < bytes; ++j) {
                if (i >= data.length || data[i] < 128) {
                    //未解析完就到达尽头是不合法的，或者字节为0b0XXXXXXX时不合法
                    return false;
                }
                ++i;
            }
        }
        return true;
    }

//    public boolean validUtf8(int[] data) {
//        int i = 0;
//        while (i < data.length) {
//            int bytes;
//            if (data[i] < 128) {
//                ++i;
//                continue;
//            }
//            if (data[i] < 192) {
//                return false;
//            }
//            if (data[i] < 224) {
//                bytes = 1;
//            } else if (data[i] < 240) {
//                bytes = 2;
//            } else if (data[i] < 248) {
//                bytes = 3;
//            } else {
//                return false;
//            }
//            ++i;
//            for (int j = 0; j < bytes; ++j) {
//                if (i >= data.length || data[i] < 128) {
//                    return false;
//                }
//                ++i;
//            }
//        }
//        return true;
//    }
}
